/*! InfluxDB Line Protocol  ES5 兼容版 */
(function (global) {
  function escTag(s) {
    if (s == null || s === void 0) return '';
    // 去掉字段名中的:_i结尾
    var str = String(s);
    if (str.endsWith(':_i')) {
      str = str.substring(0, str.length - 3);
    }
    return str.replace(/([ ,=])/g, '\\$1');
  }

  function escStr(s) {
    return '"' + s.replace(/"/g, '\\"') + '"';
  }

  // 构造函数，不用 class
  function Line(measurement) {
    this._meas = escTag(measurement);
    this._tags = [];
    this._fields = [];
    this._ts = null;
  }

  Line.prototype.tag = function (k, v) {
    if (!escTag(k) || !escTag(v)) {
      return this;
    }
    this._tags.push(escTag(k) + '=' + escTag(v));
    return this;
  };
  Line.prototype.int = function (k, v) {
    this._fields.push(escTag(k) + '=' + v + 'i');
    return this;
  };
  Line.prototype.float = function (k, v) {
    this._fields.push(escTag(k) + '=' + v);
    return this;
  };
  Line.prototype.bool = function (k, v) {
    this._fields.push(escTag(k) + '=' + (v ? 't' : 'f'));
    return this;
  };
  Line.prototype.string = function (k, v) {
    this._fields.push(escTag(k) + '=' + escStr(v));
    return this;
  };
  Line.prototype.timestamp = function (ns) {
    this._ts = ns;
    return this;
  };
  Line.prototype.toString = function () {
    if (!this._fields.length) throw new Error('fields required');
    var out = this._meas;
    if (this._tags.length) out += ',' + this._tags.join(',');
    out += ' ' + this._fields.join(',');
    if (this._ts != null) out += ' ' + this._ts;
    return out;
  };

  // 工厂函数
  function line(measurement) {
    return new Line(measurement);
  }

  // 批量 JSON → 多行字符串，字段包含:_i结尾的为int类型
  function buildLines(arr) {
    return arr
      .map(function (o) {
        var l = line(o.measurement);
        for (var tk in o.tags || {}) {
          if (o.tags.hasOwnProperty(tk)) l.tag(tk, o.tags[tk]);
        }
        for (var k in o.fields || {}) {
          if (!o.fields.hasOwnProperty(k)) continue;
          var v = o.fields[k];
          var t = typeof v;
          if (t === 'boolean') l.bool(k, v);
          else if (t === 'string') l.string(k, v);
          else if (k.endsWith('_i')) l.int(k, v | 0);
          else l.float(k, v);
        }
        if (o.time) l.timestamp(o.time);
        if (o.timestamp) l.timestamp(o.timestamp);
        return l.toString();
      })
      .join('\n');
  }

  // UMD 暴露
  global.influx = { line: line, buildLines: buildLines };
})(global);

// //  用法一
// var str = global.influx
//   .line('一车间')
//   .tag('device', '温度传感器')
//   .tag('deviceId', 'temp_0001')
//   .float('temperature', 23.7)
//   .int('humidity', 50)
//   .int('cpu', 0)
//   .bool('isOn', true)
//   .timestamp(Date.now()) // 毫秒
//   .toString();

// console.log(str);

// // 用法二
// var payload = influx.buildLines([
//   {
//     measurement: '2车间',
//     tags: { device: '温度传感器', deviceId: 'temp_0002', point: '' },
//     fields: {
//       temperature: 23.7, // float
//       humidity: 2, // int.0, // int
//       cpu: 88, // int
//       'count:_i': 1, // int
//       alert: true, // boolean
//       desc: '正常', // string
//     },
//     time: Date.now(), // 毫秒
//   },
// ]);

// console.log(payload);

export default {};
